using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Studio7i.Dominio;
using Studio7i.Negocio;
using Studio7i.Persistencia;




namespace Studio7i.Pruebas
{
    [TestFixture]
    public class TestAdministracion_Service
    {
        IApplicationContext Spring = null;
        IAdministracionService Service = null;
        Local localCreado = null;
        Sala salaInscrita = null;
        Instrumento instCreado = null;
        Cliente clienteInscrita = null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/CapaPersistencia.xml",
                "assembly://Studio7i/Studio7i/CapaNegocio.xml"
                );
               
            // Obtención de la referencia al objeto "administracionService"
            Service = (IAdministracionService)Spring.GetObject("administracionService");
           
           
            // Creación de un local de pruebas
            localCreado = ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Crear(
                new Local() { CodLocal = 11, Direccion = "Bailety 155",Distrito="San Borja" });
               
               
            // Creación de un instrumento de pruebas
            instCreado = ((IInstrumentoDAO)Spring.GetObject("instrumentoDAO_ADO")).Crear(
            new Instrumento() { Tipo = "Bateria", Marca = "Yamaha", Modelo = "N43", FechFabricacion = DateTime.ParseExact("2009", "yyyy", null), Caracteristicas = "Bateria de última    generación", CostoHora = 9, Estado = true });

            clienteInscrita = ((IClienteDAO)Spring.GetObject("clienteDAO_ADO")).Crear(
new Cliente() { CodUser = 567, NombreUsuario = "Juam", Clave = "123", DNI = "12345678", Nombres = "Juan", Apellidos = "Perez", Email = "juan@hotmail.com", FechaNac = DateTime.ParseExact("12-03-2009", "dd-MM-yyyy", null) });
 
           
        }
       
        // prueba para detectar si hay datos incompletos en isntrumento, no hay dato en el costo por hora
        [Test]
        public void InstrumentoDatosIncompletos()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarInstrumento("Guitarra", "YCA", "N67", DateTime.ParseExact("2009", "yyyy",null), "Eléctrica", 0,true);
            });

        }
       
       
        // prueba para registrar un instrumento ok,se tiene q verificar q tengan la misma data, y que el codigo sea mayor de 0
         [Test]
        public void InstrumentoCreadoOK()
        {
            Assert.DoesNotThrow(delegate
            {
                instCreado = Service.RegistrarInstrumento("Bajo", "CASIO", "OP32", DateTime.ParseExact("2009", "yyyy", null), "Bajo con 5 cuerdas", 40, true);
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(instCreado);
           
             // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(instCreado.CodInst, 0);
           
               // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(instCreado.Tipo, "Bajo");
            Assert.AreEqual(instCreado.Marca, "CASIO");
            Assert.AreEqual(instCreado.Modelo, "OP32");
            Assert.AreEqual(instCreado.FechFabricacion, "2009");
            Assert.AreEqual(instCreado.Caracteristicas, "Bajo con 5 cuerdas");
            Assert.AreEqual(instCreado.CostoHora, "40");
            Assert.AreEqual(instCreado.Estado, "Completo");
        }
       
       
       
       
       
        [Test]
        public void Test1_InscribirSala_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en características
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CodLocal, 30, null);
            });
        
}
       
        [Test]
        public void Test2_InscribirSala_Ok()
        {
            // Probamos que no exista error en la inscripción de la sala
            Assert.DoesNotThrow(delegate
            {
                salaInscrita = Service.InscribirSala("E43A Rocks!", localCreado.CodLocal, 30, ".NET Students");
            });
            // Verificamos que la sala inscrita no sea nula
            Assert.IsNotNull(salaInscrita);
            // Verificamos que el código generado para la sala sea mayor que 0
            Assert.Greater(salaInscrita.CodSala, 0);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(salaInscrita.Nombre, "E43A Rocks!");
            Assert.AreEqual(salaInscrita.Local.CodLocal, localCreado.CodLocal);
            Assert.AreEqual(salaInscrita.Capacidad, 30);
            Assert.AreEqual(salaInscrita.Caracteristicas, ".NET Students");
        }
        [Test]
        public void Test3_InscribirSala_Repetida()
        {
            // Probamos que se lance la excepción de sala repetida colocando el mismo nombre y local
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.InscribirSala("E43A Rocks!", localCreado.CodLocal, 30, ".NET Students");
            });
        }
        [Test]
 
//registrar cliente repetido
//(int coduser, string nombUsuario, string clave, string dni, string nombres, string apellidos, string email, DateTime fechaNac);

public void Test_RegistrarCliente_Repetido()
{
// Probamos que se lance la excepcion de cliente repetido colocando el mismo codigo
Assert.Catch<EntidadRepetidaException>(delegate
{
Service.RegistrarCliente(567, "Pedro Garcia", "123", "12345678", "Juan", "Perez", "juan_75@hotmail.com", DateTime.ParseExact("12-04-2009", "dd-MM-yyyy", null));
});
// coduser = 567, nombUsuario = "Juam", clave = "123", dni = "12345678", nombres = "Juan", apellidos = "Perez", email = "juan@hotmail.com", fechaNac = DateTime.ParseExact("2009", "yyyy", null) });
// Probamos que se lance la excepcin de cliente repetido colocando el mismo email
Assert.Catch<EntidadRepetidaException>(delegate
{
    Service.RegistrarCliente(5678, "Pedro Garcia", "123", "12345678", "Juan", "Perez", "juan@hotmail.com", DateTime.ParseExact("12-04-2009", "dd-MM-yyyy", null));
});
}
//registrar cliente con clave que no coincida
        [Test]
        public void Test_RegistrarCliente_ClavesNoCoinciden()
        {
            // Probamos que se lance la excepcin de cliente repetido colocando el mismo codigo
            Assert.Catch<DatosNoCoincidenException>(delegate
            {
                Service.RegistrarCliente(5678, "Pedro Garcia", "321", "12345678", "Juan", "Perez", "juan@hotmail.com", DateTime.ParseExact("12-04-2009", "dd-MM-yyyy", null));
            });
        }
        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            // Eliminamos la sala inscrita
            ((ISalaDAO)Spring.GetObject("salaDAO_ADO")).Eliminar(salaInscrita);
            // Eliminamos el local de prueba creado inicialmente
            ((ILocalDAO)Spring.GetObject("localDAO_ADO")).Eliminar(localCreado);
            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;



        }
    }
}


